/**
 * @file MeshProcessor.h
 * @brief 网格处理器类的声明
 * 
 * 提供了网格间属性插值的核心功能，特性包括：
 * 1. 高性能网格数据读取和处理
 * 2. 并行化的网格中心点计算
 * 3. 基于KD树的快速空间搜索
 * 4. 自适应插值算法选择
 * 5. SIMD优化的数值计算
 */
#pragma once
#include <string>
#include "GridStructs.h"
#include "KDTree.h"

class MeshProcessor
{
public:
    /**
     * @brief 构造函数
     * @param grid_a 源网格文件路径
     * @param grid_b 目标网格文件路径
     * @param props_a 源网格属性文件路径
     * @param output 输出结果文件路径
     * 
     * 初始化网格处理器：
     * 1. 设置文件路径
     * 2. 配置OpenMP线程数
     * 3. 预分配内存资源
     */
    MeshProcessor(const std::string &grid_a,
                 const std::string &grid_b,
                 const std::string &props_a,
                 const std::string &output);

    /**
     * @brief 执行网格处理的主函数
     * @throw std::exception 当处理过程中出现错误时抛出异常
     * 
     * 处理流程：
     * 1. 读取源网格数据和属性
     * 2. 计算源网格中心点
     * 3. 读取目标网格数据
     * 4. 计算目标网格中心点
     * 5. 构建KD树并执行插值
     * 6. 保存结果到文件
     */
    void process();

    /**
     * @brief 设置K近邻搜索的邻居数量
     * @param k 需要使用的近邻点数量
     * 
     * 配置插值计算时使用的最近邻点数量，
     * 该值影响插值结果的精度和计算性能
     */
    static void setKNearestPoints(size_t k);

private:
    // 文件路径成员
    std::string grid_a_file;   ///< 源网格文件路径
    std::string grid_b_file;   ///< 目标网格文件路径
    std::string props_a_file;  ///< 源网格属性文件路径
    std::string output_file;   ///< 输出结果文件路径

    // 网格数据成员
    GridSize size_a, size_b;   ///< 源网格和目标网格的尺寸
    std::vector<std::vector<double>> coord_a, coord_b;  ///< 网格坐标数据
    std::vector<double> zcorn_a, zcorn_b;              ///< 网格深度角点数据
    GridProperties props_a;     ///< 源网格的属性数据

    // 处理相关成员
    KDTree kdtree;             ///< 用于空间搜索的KD树实例
    std::vector<Point3D> centers_a;  ///< 源网格的中心点坐标
    std::vector<Point3D> centers_b;  ///< 目标网格的中心点坐标
    std::vector<Result> results;     ///< 插值计算结果
    static size_t K_NEAREST_POINTS;  ///< K近邻搜索的邻居数量

    /**
     * @brief 验证网格数据的有效性
     * @param size 网格尺寸
     * @param coord 网格坐标数据
     * @param zcorn 网格深度角点数据
     * @throw std::runtime_error 当数据大小不符合要求时抛出异常
     * 
     * 检查COORD和ZCORN数据的大小是否与网格尺寸匹配：
     * 1. 验证COORD数据点数量
     * 2. 验证ZCORN数据点数量
     * 3. 检查数据完整性
     */
    void validateGridData(const GridSize &size,
                         const std::vector<std::vector<double>> &coord,
                         const std::vector<double> &zcorn);

    /**
     * @brief 计算网格单元中心点坐标
     * @param size 网格尺寸
     * @param coord 网格坐标数据
     * @param zcorn 网格深度角点数据
     * @return 返回所有网格单元的中心点坐标
     * 
     * 计算流程：
     * 1. 重组ZCORN数据为3D数组
     * 2. 并行计算每个单元的8个顶点
     * 3. 计算顶点的几何中心
     * 4. 使用SIMD优化数值计算
     */
    std::vector<Point3D> calculateCellCenters(const GridSize &size,
                                            const std::vector<std::vector<double>> &coord,
                                            const std::vector<double> &zcorn);

    /**
     * @brief 执行插值计算
     * 
     * 插值处理流程：
     * 1. 构建源网格点的KD树
     * 2. 使用线程本地存储优化并行处理
     * 3. 对目标点进行分块处理提高缓存命中
     * 4. 执行K近邻搜索和插值计算
     * 5. 收集并存储结果
     */
    void performInterpolation();

    /**
     * @brief 计算目标点的插值结果
     * @param target 目标点坐标
     * @param neighbors K个最近邻点及其距离
     * @return 返回插值结果(杨氏模量, 泊松比)
     * 
     * 使用改进的IDW算法：
     * 1. 处理特殊情况(距离为0)
     * 2. SIMD优化的权重计算
     * 3. 并行化的数值计算
     */
    std::pair<double, double> calculateInterpolation(
        const Point3D &target,
        const std::vector<std::pair<double, KDTree::KDNode *>> &neighbors);
};